#ifndef __LCD_H
#define __LCD_H

#include "def.h"
#include "stm32f0xx_hal.h"
#include "gs_usb.h"

#define TFT_COMMAND 0
#define TFT_DATA    1

enum {
    CAN_DISCONNECT,
    CAN_CONNECT,
    CAN_NOCHANGE
};

enum {
    CAN_TX = 0,
    CAN_RX = 1,
    CAN_NOACT = 2
};

enum {
    DRAW_CAN_INFO = 0,
    DRAW_CAN_FRAME = 1,
    DRAW_CAN_DATA_DIR = 2,
    DRAW_CAN_CONNECT = 3,
    NONE
};

typedef uint8_t (*TaskDrawFunc)(void *task);
typedef struct {
    uint8_t task_id;
	uint32_t draw_start_x;
	uint32_t draw_start_y;
	uint32_t draw_width;
	uint32_t draw_height;
  TaskDrawFunc task_func;
} TaskInfo;



#define TFT_BL(x)      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, x)
#define TFT_RESET(x)   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, x)
#define TFT_RS(x)      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, x)

//LCD重要参数集
typedef struct  
{										    
	u16 width;			//LCD 宽度
	u16 height;			//LCD 高度
	u16 id;				//LCD ID
	u8  dir;			//横屏还是竖屏控制：0，竖屏；1，横屏。	
	u16	wramcmd;		//开始写gram指令
	u16  setxcmd;		//设置x坐标指令
	u16  setycmd;		//设置y坐标指令 
    u16 xoffset;        //x坐标偏移 
    u16 yoffset;        //y坐标偏移  
}_lcd_dev; 	  

//LCD参数
extern _lcd_dev lcddev;	//管理LCD重要参数
//LCD的画笔颜色和背景色	   
extern u16  POINT_COLOR;//默认红色    
extern u16  BACK_COLOR; //背景颜色.默认为白色
//画笔颜色
#define WHITE         	 0xFFFF
#define BLACK         	 0x0000	  
#define BLUE         	 0x001F  
#define BRED             0XF81F
#define GRED 			 0XFFE0
#define GBLUE			 0X07FF
#define RED           	 0xF800
#define MAGENTA       	 0xF81F
#define GREEN         	 0x07E0
#define CYAN          	 0x7FFF
#define YELLOW        	 0xFFE0
#define BROWN 			 0XBC40 //棕色
#define BRRED 			 0XFC07 //棕红色
#define GRAY  			 0X8430 //灰色
//GUI颜色

#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色  
#define GRAYBLUE       	 0X5458 //灰蓝色
//以上三色为PANEL的颜色 
 
#define LIGHTGREEN     	 0X841F //浅绿色
//#define LIGHTGRAY        0XEF5B //浅灰色(PANNEL)
#define LGRAY 			 0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)

void TFT_init(void);
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height);
void Lcd_Init(void);
void lcd_test(void);
void LCD_DrawBackground(void);
// void LCD_SetDataDirect(uint8_t dir);
// void LCD_SetConnectStatus(uint8_t status);
// void LCD_ShowFrame(struct gs_host_frame *frame);
// void LCD_ShowInfo(uint32_t rx, uint32_t tx, uint32_t err);
void LCD_PutFrame(struct gs_host_frame *frame, uint8_t frame_type);
void LCD_Task(void);
void LCD_SetCanStatus(uint8_t status);

#endif